package main

import (
	"fmt"
	"net"
	"strconv"
)

//IServer 服务器的抽象接口
type IServer interface {
	startServer(ip string, port int) bool //开始服务
	stopServer()                          //停止服务
	getLastError() string                 //获取最后一条错误

}

//Server 服务器的实现
type Server struct {
	ip         string
	port       int
	isListened bool
	lastErrmsg string
	listener   net.Listener
}

//开始服务
func (ser Server) startServer(ip string, port int) bool {
	if ser.isListened == true {
		return false
	}
	go ser.run(ip + ":" + strconv.Itoa(port))
	return true
}

//停止服务
func (ser Server) stopServer() {
	if ser.isListened {
		ser.listener.Close()
	}
}

//获取最后一条错误
func (ser Server) getLastError() string {
	return ser.lastErrmsg
}

//服务器监听过程
func (ser Server) run(address string) {
	fmt.Println("地址: " + address)
	listener, err := net.Listen("tcp4", address)
	ser.listener = listener
	if err != nil {
		fmt.Println("监听失败: " + err.Error())
	}
	ser.isListened = true
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error accepting", err.Error())
		}
		fmt.Println("添加协程")
		go ser.newConnection(conn)
	}
}

//处理新连接
func (ser Server) newConnection(conn net.Conn) {
	fmt.Println("处理新连接")
	var control Control
	control.Control(conn)
}
